package savet;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JMenuItem;
import savet.entidades.Empregador;
import savet.entidades.atributos.Legenda;
import savet.gui.controllers.SAVETController;
import java.util.Hashtable;
import java.util.Properties;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.KeyStroke;
import org.openswing.swing.domains.java.Domain;
import org.openswing.swing.internationalization.java.BrazilianPortugueseOnlyResourceFactory;
import org.openswing.swing.internationalization.java.ResourcesFactory;
import org.openswing.swing.mdi.client.MDIFrame;
import org.openswing.swing.util.client.ClientSettings;
import org.openswing.swing.util.client.ClientUtils;
import org.openswing.swing.util.java.Consts;
import savet.entidades.Lote;
import savet.gui.dialogos.DialogoEmpregador;
import savet.repositorio.RepositorioEmenta;
import savet.util.JOptionUtil;
import savet.util.ListLegendas;
import savet.util.LoteUtil;
import savet.util.io.ArquivoUtil;

/**
 *
 * @author rafael
 */
public class Main {

    private static Hashtable domains;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Domain domain = new Domain("sexo");

        domain.addDomainPair("F", "F");

        domain.addDomainPair("M", "M");

        Main.addDomain(domain);

        ResourcesFactory f = new BrazilianPortugueseOnlyResourceFactory(getProperties(), true);

        ClientSettings clientSettings = new ClientSettings(f, getDomains());

        ClientSettings.BUTTON_BEHAVIOR = Consts.BUTTON_IMAGE_AND_TEXT;
        ClientSettings.FORCE_FOCUS_ON_LOOKUP_CONTROL = true;

        ArquivoUtil.criarArquivoUtilInstance(ArquivoUtil.ARQUIVO_XML);

        // Carregar ementas
        new RepositorioEmenta();

        // Carregar legendas
        try {
            File fileLegendas = new File("resource/legendas.saud");
            List<Legenda> legendas = (List<Legenda>) ArquivoUtil.getInstance().abrirArquivo(fileLegendas);

            ListLegendas.getInstance().setList(legendas);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        // cria MDIFrame
        MDIFrame frame = new MDIFrame(new SAVETController());
        // configura JToolbar no MDIFrame
        configuraToolbar();
        // exibe MDIFrame
        frame.setVisible(true);


    }

    private static void configuraToolbar() {
        final MDIFrame frame = MDIFrame.getInstance();

        JButton btnNovoLote = new JButton("Novo lote", new ImageIcon("images/lote_24.png"));
        configurarJButton(btnNovoLote);
        btnNovoLote.setToolTipText("Criar novo lote");
        btnNovoLote.setMnemonic(KeyEvent.VK_N);

        btnNovoLote.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                LoteUtil util = LoteUtil.getInstance();
                Lote loteAtual = util.getLoteAtual();

                // Verifica se existe lote iniciado
                if (loteAtual != null) {
                    JOptionUtil.showWarningMessage("Encerre o lote atual fechando a frame de lotes!", "Lote existente...");
                } else {
                    SAVETFachada facade = (SAVETFachada) MDIFrame.getClientFacade();
                    facade.getNovoLote();
                }
            }
        });

        JButton btnInserirEmpresa = new JButton(new ImageIcon(ClientUtils.getImage(ClientSettings.BUTTON_INSERT_IMAGE_NAME)));
        configurarJButton(btnInserirEmpresa);
        btnInserirEmpresa.setText("Inserir empresa");
        btnInserirEmpresa.setToolTipText("Inserir empresa ao lote");
        btnInserirEmpresa.setMnemonic(KeyEvent.VK_E);
        btnInserirEmpresa.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                LoteUtil util = LoteUtil.getInstance();
                Lote loteAtual = util.getLoteAtual();

                // Verifica se existe lote iniciado
                if (loteAtual != null) {
                    DialogoEmpregador de = new DialogoEmpregador(frame, true);
                    de.setVisible(true);
                    Empregador empregador = de.getEmpregador();

                    // Verifica se o cadastro do empregador foi concluido
                    if (empregador != null) {
                        util.adicionarEmpregador(empregador);
                    }
                } else {
                    JOptionUtil.showWarningMessage("Crie um lote primeiramente!", "Sem lote...");
                }
            }
        });

        Action salvarLoteAction = new AbstractAction("Salvar lote") {

            public void actionPerformed(ActionEvent e) {
                LoteUtil util = LoteUtil.getInstance();
                Lote loteAtual = util.getLoteAtual();
                if (loteAtual != null) {
                    util.salvarArquivoLote();
                } else {
                    JOptionUtil.showInfoMessage("Sem lote para salvar!", "Lote nulo...");
                }
            }
        };

        JButton btnSalvarLote = new JButton(new ImageIcon(ClientUtils.getImage(ClientSettings.BUTTON_SAVE_IMAGE_NAME)));
        configurarJButton(btnSalvarLote);
        btnSalvarLote.setText(salvarLoteAction.getValue(Action.NAME).toString());
        btnSalvarLote.addActionListener(salvarLoteAction);
        btnSalvarLote.setToolTipText("Salvar lote em arquivo");

        JMenuItem salvarLoteItem = frame.getMenuItem("salvarLote");
        salvarLoteItem.addActionListener(salvarLoteAction);
        
        frame.addButtonToToolBar(btnNovoLote);
        frame.addButtonToToolBar(btnInserirEmpresa);
        frame.addButtonToToolBar(btnSalvarLote);
    }

    private static void configurarJButton(JButton button) {
        button.setVerticalTextPosition(JButton.BOTTOM);
        button.setHorizontalTextPosition(JButton.CENTER);
    }

    private static Properties getProperties() {
        Properties p = new Properties();
        p.put("codAfastamento", "MA");
        p.put("nome", "Nome");
        p.put("admissao", "Admissao");
        p.put("afastamento", "Demissao");
        p.put("pis", "PIS");
        p.put("novolote", "Novo lote");
        return p;
    }

    private static Hashtable getDomains() {
        return domains;
    }

    private static void setDomains(Hashtable domains) {
        Main.domains = domains;
    }

    private static void addDomain(Domain domain) {
        if (domains == null) {
            domains = new Hashtable();
        }
        domains.put(domain.getDomainId(), domain);
    }
}
